import { NextResponse } from 'next/server';
import { ContainerGenerator } from '@/app/utils/generator';
import { ContainerConfig, ContainerEnv } from '@/app/config/devcontainer';
import fs from 'fs/promises';
import path from 'path';

export async function POST(request: Request) {
  try {
    const { env, config } = await request.json() as {
      env: ContainerEnv;
      config: Partial<ContainerConfig>;
    };

    // 验证环境类型
    if (!['dev', 'test', 'prod'].includes(env)) {
      return NextResponse.json(
        { error: '无效的环境类型' },
        { status: 400 }
      );
    }

    const generator = new ContainerGenerator(env, config);
    const dockerfileContent = generator.generateDockerfile();

    // 确保输出目录存在
    const outputDir = path.join(process.cwd(), 'output', env);
    await fs.mkdir(outputDir, { recursive: true });

    // 写入 Dockerfile
    const dockerfilePath = path.join(outputDir, 'Dockerfile');
    await fs.writeFile(dockerfilePath, dockerfileContent, 'utf-8');

    // 生成 .env 文件（如果是开发环境）
    if (env === 'dev') {
      const envContent = [
        '# 开发环境配置',
        'RUST_LOG=debug',
        'RUST_BACKTRACE=1',
        config.system?.mirrors ? `RUSTUP_DIST_SERVER=${config.system.mirrors.rustup}` : '',
        config.system?.mirrors ? `RUSTUP_UPDATE_ROOT=${config.system.mirrors.rustup}/rustup` : '',
      ].filter(Boolean).join('\n');

      await fs.writeFile(path.join(outputDir, '.env'), envContent, 'utf-8');
    }

    // 生成 docker-compose.yml（如果是测试或生产环境）
    if (env === 'test' || env === 'prod') {
      const composeContent = `version: '3.8'
services:
  ${config.name || `rust-${env}`}:
    build:
      context: .
      dockerfile: Dockerfile
    ${config.ports?.length ? `ports:\n      - "${config.ports.join('\\n      - "')}"` : ''}
    ${env === 'prod' ? 'restart: always' : ''}
    volumes:
      - ./data:/app/data
    environment:
      - RUST_LOG=${env === 'prod' ? 'info' : 'debug'}
      - TZ=${config.system?.timezone || 'UTC'}`;

      await fs.writeFile(path.join(outputDir, 'docker-compose.yml'), composeContent, 'utf-8');
    }

    // 生成 README.md
    const readmeContent = `# Rust ${env === 'dev' ? '开发' : env === 'test' ? '测试' : '生产'} 环境

## 环境说明
- 基础镜像: ${config.baseImage}
- 时区: ${config.system?.timezone || 'UTC'}
- 语言: ${config.system?.locale?.lang || 'en_US.UTF-8'}

## 包含的工具
${Object.entries(config.toolchain || {})
  .filter(([_, enabled]) => enabled)
  .map(([tool]) => `- ${tool}`)
  .join('\n')}

## 使用方法
${env === 'dev' ? `
1. 启动开发容器:
   \`\`\`bash
   docker-compose up -d
   \`\`\`
2. 连接到开发环境:
   - 使用 VS Code Remote - Containers
   - 或使用 Cursor Remote Development` :
env === 'test' ? `
1. 构建测试镜像:
   \`\`\`bash
   docker-compose build
   \`\`\`
2. 运行测试:
   \`\`\`bash
   docker-compose up
   \`\`\`` :
`
1. 构建生产镜像:
   \`\`\`bash
   docker-compose build
   \`\`\`
2. 部署服务:
   \`\`\`bash
   docker-compose up -d
   \`\`\``}

## 注意事项
${env === 'dev' ? '- 首次启动时会安装所有开发依赖，可能需要一些时间' :
env === 'test' ? '- 测试环境包含必要的测试依赖，但不包含完整的开发工具' :
'- 生产环境已优化为最小运行时环境，仅包含必要的运行时依赖'}
- 时区设置为 ${config.system?.timezone || 'UTC'}
${config.system?.mirrors ? '- 使用自定义镜像源加速构建' : ''}`;

    await fs.writeFile(path.join(outputDir, 'README.md'), readmeContent, 'utf-8');

    return NextResponse.json({
      success: true,
      files: {
        dockerfile: dockerfileContent,
        env: env === 'dev',
        compose: env === 'test' || env === 'prod',
        readme: true
      }
    });

  } catch (error) {
    console.error('生成配置失败:', error);
    return NextResponse.json(
      { error: '生成配置失败' },
      { status: 500 }
    );
  }
} 